/**
 * 权限认证
 */
import router from '@/router'
import store from '@/store'
import {
	Message
} from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import {
	getToken
} from '@/utils/cookie.js' // get token from cookie
import getPageTitle from '@/utils/get-page-title'

/**
 * 进度条设置
 */
NProgress.configure({
	showSpinner: false
})
/**
 * 不需要过滤的路径
 */
const whiteList = ['/login']
/**
 * 路由守护  在每个路由跳转之前 参数 to跳转到哪里 from 词干跳转 next跳转
 */
router.beforeEach(async (to, from, next) => {
	/**
	 * 进度条开始
	 */
	NProgress.start()
	//设置页面标题
	document.title = getPageTitle(to.meta.title)

	//获取登陆后的token
	const hasToken = getToken()

	if (hasToken) {
		/**
		 * 如果有token
		 */
		if (to.path === '/login') {
			/**
			 * 如果来的路径是登陆的话直接重定向到首页
			 */
			next({
				path: '/'
			})
			NProgress.done()
		} else {
			/**
			 * 如果不是登陆界面获取用户名称
			 */
			const hasGetUserInfo = store.getters.name
			if (hasGetUserInfo) {
				/**
				 * 获取成功直接跳转
				 */
				next()
			} else {
				/**
				 * 获取用户信息失败
				 */
				try {
					/**
					 * 获取用户信息
					 */
					await store.dispatch('user/getInfo')

					const accessRoutes = await store.dispatch('permission/generateRoutes')

					// dynamically add accessible routes
					router.addRoutes(accessRoutes)

					// hack method to ensure that addRoutes is complete
					// set the replace: true, so the navigation will not leave a history record
					next({ ...to,
						replace: true
					})


				} catch (error) {
					/**
					 * 重置token 重定向到登陆界面 终止进度条
					 */
					await store.dispatch('user/resetToken')
					Message.error(error || 'Has Error')
					next(`/login?redirect=${to.path}`)
					NProgress.done()
				}
			}
		}
	} else {
		/**
		 * 如果没有token
		 */
		if (whiteList.indexOf(to.path) !== -1) {
			/**
			 * 跳转路径在白名单中 直接跳转
			 */
			next()
		} else {
			/**
			 * 不再白名单中的话 重定向到登陆界面  进度条结束
			 */
			next(`/login?redirect=${to.path}`)
			NProgress.done()
		}
	}
})

/**
 * 路由守护 在每个路由结束之后
 */
router.afterEach(() => {
	/**
	 * 进度条结束
	 */
	NProgress.done()
})

/**
 * @param {Object} value
 */
export default function checkPermission(value) {
	if (value && value instanceof Array && value.length > 0) {
		const roles = store.getters && store.getters.roles
		const permissionRoles = value

		const hasPermission = roles.some(role => {
			return permissionRoles.includes(role)
		})
		return hasPermission
	} else {
		console.error(`need roles! Like v-permission="['admin','editor']"`)
		return false
	}
}
